#pragma once
#ifndef OBR_CUDABUFFER_H
#define OBR_CUDABUFFER_H

#include "common.h"
#include "helpers/Helpers.h"

namespace OBR
{
struct CudaBuffer
{
    inline CUdeviceptr d_pointer() const
    {
        return (CUdeviceptr)d_ptr;
    }

    /**
     * @brief 在CUDA中开辟存储空间
     *
     * @param size
     */
    void alloc(size_t size);

    void resize(size_t size);

    /**
     * @brief free allocated memory
     *
     */
    void free();

    /**
     * @brief 将数据从内存中拷贝到CUDA
     *
     * @param t 内存中的数据指针
     * @param size
     */
    void upload(const void *t, size_t size);

    /**
     * @brief 将数据从CUDA拷贝到内存中
     *
     * @param t
     * @param size
     */
    void download(void *t, size_t size);

    /**
     * @brief 将数据从另一个buffer中复制一份到本处
     *
     * @param src
     */
    void copy(CudaBuffer &src);

    size_t sizeInBytes{0};
    void *d_ptr{nullptr}; // device pointer

    ~CudaBuffer();
    CudaBuffer();
    CudaBuffer(size_t size);
    CudaBuffer(const CudaBuffer &src);
};
} // namespace OBR
#endif